/*
 * ArbolBSharpStringLong.h
 *
 *  Created on: 02/10/2010
 *      Author: jijodra
 */

#ifndef ARBOLBSHARPSTRINGLONG_H_
#define ARBOLBSHARPSTRINGLONG_H_

#include <string>
#include <iostream>
#include <vector>
#include "CabeceraBSharp.h"
#include "RegistroBSharpStringLong.h"
#include "NodoBSharpStringLong.h"
#include "Puntero.h"
#include "../moduloAlmacenamiento/ManejadorAccesoDatos.h"

using namespace std;

class ArbolBSharpStringLong {
private:
	static const char HIJO_IZQ;
	static const char HIJO_DER;

    static const long LONG_REGISTROS;
	static const long LONG_PUNTERO;

	static const long BLOQUE_CABECERA;
	static const long BLOQUE_RAIZ;

	static const long NUM_NODO_RAIZ;

	CabeceraBSharp cabecera;
	NodoBSharpStringLong raiz;
	void AgregarClaveOrdenada(NodoBSharpStringLong* nodo, RegistroBSharpStringLong registro);
	string BalancearCadena(string cadena);
	NodoBSharpStringLong CrearHijo(NodoBSharpStringLong padre, char lado);
	bool BuscarInterno(NodoBSharpStringLong nodo, string clave, Puntero* puntero, RegistroBSharpStringLong* registro);
	Puntero BuscarSiguiente(NodoBSharpStringLong nodo, string clave);
	void ReemplazarClave(string claveVieja, string claveNueva, Puntero puntero);
	void ReemplazarClaveGeneral(string claveVieja, string claveNueva);
	void Promover(vector<Puntero> camino, Puntero puntHijoNuevo, string clave);
	void Despromover(string claveAEliminar, vector<Puntero> camino);
	void GuardarCabecera();
	void RecuperarCabecera();
	bool EsPrimerHijo(NodoBSharpStringLong nodoPadre, NodoBSharpStringLong nodoHijo);
	bool EsUltimoHijo(NodoBSharpStringLong nodoPadre, NodoBSharpStringLong nodoHijo);

public:
    static const short NODO_RAIZ;
	static const short NODO_HOJA;
	static const short NODO_INDICE;

    static const long LONG_CLAVE;

    ArbolBSharpStringLong();
	char* fileName;
	void Crear(char* filePathName);
	void Abrir(char* filePathName);
	void InsertarRegistro(RegistroBSharpStringLong registro);
	bool ModificarRegistro(string clave, long valor, long valorExtra);
	void EliminarRegistro(string clave);
	RegistroBSharpStringLong ObtenerRegistro(string clave);
	void Imprimir(Puntero puntero);
	vector<long> RecorrerOrdenado();

	virtual ~ArbolBSharpStringLong();
};

#endif /* ARBOLBSHARPSTRINGLONG_H_ */
